/**
 * FlexiGridUtils.java V1.0 Feb 20, 2012 4:35:46 PM
 * 
 * Copyright 2011 AsiaInfo Linkage, All rights reserved.
 * 
 * Modification history(By Time Reason):
 * 
 * Description:
 */

package xframe.core.flexigrid;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import net.sf.json.JSONObject;

import com.ai.appframe2.bo.DataContainer;
import com.ai.appframe2.common.DataType;

/**
 * 功能描述：
 * 
 * @author 余根宁
 * 
 * <p>
 * 修改历史：(修改人，修改时间，修改原因/内容)
 * </p>
 */
public class FlexiGridUtils {
    
    public static String generateFlexiGridJson(int total, int page, DataContainer[] datas) {

        FlexiGridResult result = new FlexiGridResult();
        result.setTotal(total);
        result.setPage(page);
        result.setRows(generateFlexiGridRow(datas));
        
        JSONObject object = JSONObject.fromObject(result);
        return object.toString();
    }
    
    /**
     * 
     * 功能描述：
     * 
     * @author 余根宁
     *         <p>
     *         创建日期 ：Feb 20, 2012 6:53:16 PM
     *         </p>
     * 
     * @param datas
     * @return
     * 
     * <p>
     * 修改历史 ：(修改人，修改时间，修改原因/内容)
     * </p>
     */
    private static List<FlexiGridRow> generateFlexiGridRow(DataContainer[] datas) {

        List<FlexiGridRow> result = new ArrayList<FlexiGridRow>();
        
        if (datas == null || datas.length == 0) {
            result.clear();
        } else {
            for (int i = 0; i < datas.length; i++) {
                DataContainer data = datas[i];
                FlexiGridRow row = new FlexiGridRow();
                // 设置值
                row.setCell(buildRowValue(data));
                // 设置主键
                row.setId(buildKey(data, i));
                result.add(row);
            }
        }
        return result;
    }
    
    /**
     * 
     * 功能描述：值转换；
     *
     * @author  余根宁
     * <p>创建日期 ：Feb 20, 2012 7:20:47 PM</p>
     *
     * @param data
     * @return
     *
     * <p>修改历史 ：(修改人，修改时间，修改原因/内容)</p>
     */
    private static Map<String,String> buildRowValue(DataContainer data){
        Map<String,String> map = new HashMap<String,String>();
        if(data == null){
            map.clear();
        } else {
            for(String property : data.getPropertyNames()){
                map.put(property, convertValue(data.get(property)));
            }
        }
        return map;
    }
    
    /**
     * 
     * 功能描述：设置主键，如果没有主键，那么取行数作为主键；否则，取主键值，多个主键值，之间用“-”分割；
     * 
     * @author 余根宁
     *         <p>
     *         创建日期 ：Feb 20, 2012 7:17:55 PM
     *         </p>
     * 
     * @param data
     * @param index
     * @return
     * 
     * <p>
     * 修改历史 ：(修改人，修改时间，修改原因/内容)
     * </p>
     */
    private static String buildKey(DataContainer data, int index) {

        String[] keys = data.getKeyPropertyNames();
        if (keys == null || keys.length == 0) {
            return index + "";
        } else {
            StringBuffer buf = new StringBuffer();
            for (int jindex = 0; jindex < keys.length; jindex++) {
                if (jindex > 0) {
                    buf.append("-");
                }
                buf.append(convertValue(data.get(keys[jindex])));
            }
            return buf.toString();
        }
    }
    
    /**
     * 
     * 功能描述：转换格式
     *    日期默认格式转换为：yyyy-MM-dd HH:mm:ss
     * 
     * @author 余根宁
     *         <p>
     *         创建日期 ：Feb 20, 2012 7:10:38 PM
     *         </p>
     * 
     * @param value
     * @return
     * 
     * <p>
     * 修改历史 ：(修改人，修改时间，修改原因/内容)
     * </p>
     */
    private static String convertValue(Object value) {

        if (value == null) {
            return "";
        } else if (value instanceof Integer || value instanceof Long || value instanceof Double
                || value instanceof Float) {
            return value + "";
        } else if (value instanceof java.sql.Timestamp || value instanceof java.sql.Date) {
            return DataType.transferToString(value, DataType.DATATYPE_DATETIME);
        } else {
            return value.toString();
        }
    }
}
